package com.yunke.service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yunke.entity.YunkeCommunity;
import com.yunke.entity.dto.YunkeCommunityDto;
import com.yunke.entity.vo.YunkeCommunityMemberVo;
import com.yunke.entity.vo.YunkeCommunityPostVo;
import com.yunke.entity.vo.YunkeCommunityVo;

import java.math.BigDecimal;
import java.util.List;

/**
 * 社群管理服务接口
 * 
 * @author yunke
 * @since 1.0.0
 */
public interface YunkeCommunityService extends IService<YunkeCommunity> {

    /**
     * 创建社群
     */
    Long createCommunity(YunkeCommunityDto dto, Long userId);

    /**
     * 更新社群信息
     */
    boolean updateCommunity(YunkeCommunityDto dto, Long userId);

    /**
     * 删除社群
     */
    boolean deleteCommunity(Long communityId, Long userId);

    /**
     * 获取社群详情
     */
    YunkeCommunityVo getCommunityDetail(Long communityId, Long userId);

    /**
     * 分页查询社群列表
     */
    Page<YunkeCommunityVo> getCommunityPage(Integer current, Integer size, String keyword,
                                            Integer communityType, Long categoryId, String region,
                                            BigDecimal longitude, BigDecimal latitude, Integer distance, Long userId);

    /**
     * 获取推荐社群列表
     */
    List<YunkeCommunityVo> getRecommendCommunities(Long userId, Integer limit);

    /**
     * 获取热门社群列表
     */
    List<YunkeCommunityVo> getHotCommunities(Long userId, Integer limit);

    /**
     * 获取附近社群列表
     */
    List<YunkeCommunityVo> getNearbyCommunities(BigDecimal longitude, BigDecimal latitude,
                                                Integer distance, Long userId, Integer limit);

    /**
     * 根据分类获取社群列表
     */
    List<YunkeCommunityVo> getCommunitiesByCategory(Long categoryId, Long userId, Integer limit);

    /**
     * 搜索社群
     */
    List<YunkeCommunityVo> searchCommunities(String keyword, Long userId, Integer limit);

    /**
     * 申请加入社群
     */
    boolean joinCommunity(Long communityId, Long userId, String reason);

    /**
     * 退出社群
     */
    boolean leaveCommunity(Long communityId, Long userId);

    /**
     * 邀请用户加入社群
     */
    boolean inviteUserToCommunity(Long communityId, Long userId, Long inviteUserId, String message);

    /**
     * 踢出社群成员
     */
    boolean removeMemberFromCommunity(Long communityId, Long userId, Long memberId, String reason);

    /**
     * 设置社群管理员
     */
    boolean setMemberAsAdmin(Long communityId, Long userId, Long memberId);

    /**
     * 取消社群管理员
     */
    boolean removeMemberAsAdmin(Long communityId, Long userId, Long memberId);

    /**
     * 禁言社群成员
     */
    boolean muteMember(Long communityId, Long userId, Long memberId, Long muteEndTime, String reason);

    /**
     * 解除禁言
     */
    boolean unmuteMember(Long communityId, Long userId, Long memberId);

    /**
     * 更新社群公告
     */
    boolean updateCommunityAnnouncement(Long communityId, Long userId, String announcement);

    /**
     * 更新社群规则
     */
    boolean updateCommunityRules(Long communityId, Long userId, String rules);

    /**
     * 获取社群成员列表
     */
    Page<YunkeCommunityMemberVo> getCommunityMembers(Long communityId, Integer current, Integer size,
                                                     Integer memberRole, String keyword, Long userId);

    /**
     * 获取社群动态列表
     */
    Page<YunkeCommunityPostVo> getCommunityPosts(Long communityId, Integer current, Integer size,
                                                 Integer postType, Boolean isTop, Boolean isEssence, Long userId);

    /**
     * 获取用户创建的社群列表
     */
    List<YunkeCommunityVo> getUserCreatedCommunities(Long userId);

    /**
     * 获取用户加入的社群列表
     */
    List<YunkeCommunityVo> getUserJoinedCommunities(Long userId);

    /**
     * 转让社群群主
     */
    boolean transferCommunityOwnership(Long communityId, Long userId, Long newOwnerId);

    /**
     * 解散社群
     */
    boolean dissolveCommunity(Long communityId, Long userId);

    /**
     * 社群置顶
     */
    boolean topCommunity(Long communityId, Long adminId, Long topEndTime);

    /**
     * 取消置顶
     */
    boolean cancelTopCommunity(Long communityId, Long adminId);

    /**
     * 审核社群
     */
    boolean auditCommunity(Long communityId, Long adminId, Integer auditStatus, String auditRemark);

    /**
     * 获取社群统计信息
     */
    YunkeCommunityVo getCommunityStats(Long communityId);
} 